Throughout the world, computers and embedded computing devices have been incorporated into nearly every facet of daily life. Computers process instructions by interpreting and executing software source code. Source code is typically written by software developers using one or more programming and/or scripting languages. Source code is often lengthy and complex, involving numerous functions and routines. Writing and debugging source code can often be a tedious job for software developers.
In order to make the drafting and debugging processes easier for software developers, source code is typically written within an integrated development environment (IDE). IDE's are software programs that have many features which are aimed to prevent developers from making mistakes while drafting source code (e.g. code coloring, syntax prompting, etc.). IDE's also provide a means for identifying errors that the developer may have overlooked and are still present in the code during the time of compilation. However, finding syntactical bugs in the source code is only a small part of developing functioning code. Determining how to draft the code that resolves the error is often more time consuming that finding the bug. Current IDE's have the ability to automatically detect many types of software bugs. However, IDE's lack the ability to automatically fix the bugs they find.
Furthermore, in some cases, a developer may know the inputs for a certain function as well as the expected outputs, and yet be unclear as to how to write the code that will result in the expected outputs with the given inputs. Still in other cases, a developer may be short on time and may only be able to write a skeleton structure or partial portion of what the finished code should look like. In such cases, the developer's only solution is to spend more time with the project, writing the code until it is complete. Current IDE's and other software drafting aides are not able to automatically draft entire or even partial code segments based on a set of corresponding input/output (I/O) pairs, despite advancements in the field of machine learning.
Machine learning is broadly concerned with developing algorithms and techniques that allow computers to learn. One way computers can “learn” is by analyzing massive amounts of data and attempting to discover rules or patterns that explain how the data was generated. In a method called “supervised learning”, an algorithm can attempt to generate a function that maps inputs to desired outputs. Often, in order to generate such functions, a technique known as probabilistic inference is used. Other forms of machine learning are used to decipher patterns in large quantities of statistical data. However, machine learning has found limited, if any, application to synthesizing or automatically debugging program code.